#pragma once
#include <cstdint>
#include <ifaddrs.h>
#include <iostream>
#include <stdint.h>
#include <unordered_set>
#include <vector>

namespace util::system
{

const int         InvalidVlan             = -1;
const int         InvalidMtu              = -1;
const std::string UbuntuNetcardPathLegacy = "/etc/network/interfaces.d";
const std::string UbuntuNetcardPathNew    = "/etc/netplan";
const std::string CentosNetcardPath       = "/etc/sysconfig/network-scripts";

struct NetcardVlan
{
    int         vlanId = -1;
    std::string ip;
    std::string netmask;
};

struct NetcardIp
{
    std::string              name;
    bool                     status = false;  // 目前不需要读取
    std::string              mac;
    std::string              ip;
    std::string              netmask;
    std::string              gateway;  // 目前不需要读取
    int                      mtu = -1;
    std::vector<NetcardVlan> vlan;
};

struct RouteInfo
{
    std::string destination;
    int netmask;
    std::string gateway;
    std::string interface;
};

std::string ExecuteCommand(const std::string& command);
int         ExecuteCommand(const std::string& cmd, std::string& startRes);
int         ExecuteCommandWithTimeout(const std::string& command, int timeout, std::string& result);

// 存储大小为 Byte(字节)
size_t GetDiskTotalSpace(const std::string& path);
// 存储大小为 Byte(字节)
size_t GetDiskUsableSpace(const std::string& path);

/// 获取本次调用到上次调用这段时间内的CPU使用率。
/// CPU只能统计某段时间内的使用率,无法得到瞬时CPU使用率。
/// 外部通过timer固定时间间隔取CPU使用率。

float GetCpuUseRate();
float GetMemoryUseRate();

float GetDiskUseRate();

std::vector<std::string> GetInterfaceName();

void GetInterfaceInfo(const std::string& name, std::string& ip, int& mask, bool& status);

void GetInterfaceRate(const std::string& name, int& rx_rate, int& tx_rate);

std::string GetDiskSerialNumber();
// 获取系统自启动以来的总时间
uint64_t GetSystemUpTime();
// 获取 MAC 地址
std::string GetMACAddress(struct ifaddrs* ifa);
// 获取系统版本
std::string GetOSVersion();
// 获取指定网卡的 MTU
int GetMtu(const std::string& ifname);
//判断网卡下的ip/mask是否存在
bool Exists(const std::string& name, const std::string& ip = "", const std::string& netmask = "");

// 写网卡文件
void SetValue(std::vector<std::string>& lines, const std::string& key, const std::string& value);
// 写网卡文件
void SetFile(const std::string& name, const std::string& ip, const std::string& netmask, int vlan = InvalidVlan, int mtu = InvalidMtu, const std::string& osType = "centos");
// 获取网卡信息
std::vector<NetcardIp> GetEthInfo();
//添加vlan(临时)
int AddVlan(const std::string& name, int vlan);
//设置网卡/VLAN IP地址(临时)
int SetIpAddress(const std::string& iface, const std::string& ip, const std::string& netmask);
//删除 VLAN
int DelVlan(const std::string& vlan_iface);
// 获取路由
std::string FindField(const std::string& line, const std::string& key);
std::vector<RouteInfo> GetRoutes();
// 添加路由
int AddRouteViaNetlink(const RouteInfo& info);
// 删除路由
int DeleteRouteViaNetlink(const RouteInfo& info);
}  // namespace util::system
